
using System;
using System.Collections.Generic;
using System.Threading;
using Microsoft.Extensions.Logging;

namespace WebLog
{
    public class WebLog_Logger : ILogger, IDisposable
    {
        bool isNull;
        public WebLog_Logger(bool isNull)
        {
            this.isNull = isNull;
        }
        public IDisposable BeginScope<TState>(TState state)
        {//开始记录
            return this;
        }

        public void Dispose()//暂时不处理释放 因为是丢到监听队列
        {//内部调用是一个 useing log.BeginScope 的过程 所以需要的资源等等

        }
        public bool IsEnabled(LogLevel logLevel)
        {
            return !isNull;//空日志模式直接未启用
        }

        public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
        {//写的实体
            if (isNull) return;//空日志模式直接返回
            LoggerHelper.AppendSql(() => formatter(state, exception));
        }
    }
    public class WebLog_LoggerProvider : ILoggerProvider
    {
        static List<string> _categoryNames = new List<string>();
        public WebLog_LoggerProvider(string categoryName)
        {
            if (!string.IsNullOrEmpty(categoryName))
                _categoryNames.Add(categoryName);
        }
        public WebLog_LoggerProvider(List<string> categoryNames)
        {
            if (categoryNames != null)
                _categoryNames.AddRange(categoryNames);
        }
        //如果有日志就使用已有的日志
        public ILogger CreateLogger(string categoryName)
        {//不能返回空的Log
            if (!_categoryNames.Contains(categoryName))
                return nullLogger;
            return Logger;
        }
        static WebLog_Logger nullLogger = new WebLog_Logger(true);
        static WebLog_Logger Logger = new WebLog_Logger(false);
        public void Dispose()//暂时不处理释放 就两个logger对象
        {
        }
    }
}